/**
 * @file gtkArbre.h
 * @brief Fichier d'entête du module gtkArbre.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_gtkArbre_H
#define H_gtkArbre_H

/* *********************************************************************

                       Librairies de genre                           

********************************************************************* */

#include <gtk/gtk.h>
#include "gtkInfo.h"
#include "../core/arbre.h"
#include "../db/dbregroupement.h"
#include "../db/dboeuvre.h"

/* *********************************************************************

                        Définitions de types                           

********************************************************************* */

typedef enum
  {
    VUE_COLUMN, /** Un check pour savoir si il a été vue */
    ILLUSTRATION_COLUMN, /** L'affiche de la ligne */
    TITRE_COLUMN, /** Titre de l'oeuvre ou du regroupement */
    GENRE_COLUMN, /** Liste de genre */
    EDITEUR_COLUMN, /** Editeur */
    REALISATEUR_COLUMN, /** Réalisateur */
    METRAGE_COLUMN, /** Type de métrage, court, moyen, long */
    NOTEPERSO_COLUMN, /** La note attribuée */
    DATE_COLUMN, /** Date de sortie, dans les bacs, à la fiche */
    TYPE_COLUMN, /** Connaitre le type de l'oeuvre, film, musique ou livre */
    ID_COLUMN, /** L'id de la ligne dans la base de donnée */
    ARBRE_COLUMN,
    N_COLUMNS /** Le nombre de colonne */
  } COLUMN;

struct sGtkArbre
{
  GtkWidget *gArbre; /** Vue du GtkTreeView */
  Arbre *arbre; /** Arbre contenant les différentes données */
  GtkTreeStore *store; /** Magasin contenant les diverses données */
  GtkWidget *scroll; /** SrrollBar */ 
  GtkInfo *gInfo;
};

typedef struct sGtkArbre GtkArbre;

/**
 * @fn GtkArbre * creer_GArb() ;
 * @brief Crée un treeView et le retourne pour l'afficher
 *
 * @return un pointeur sur GtkWidget
 */
GtkArbre * creer_GArb(GtkInfo *info);

/**
 * @fn void detruire_GArb(GtkArbre **gArbre);
 * @brief Detruit le GtkArbre
 *
 * @param[in,out] gArbre
 */
void detruire_GArb(GtkArbre **gArbre);

/**
 * @fn GtkWidget getGtkArbre(GtkArbre *gArbre);
 * @brief Returne le GtkTreeView de la structure GtkArbre
 *
 * @param gArbre 
 */
GtkWidget *getContainer_GArb(GtkArbre *gArbre);

/**
 * @fn void recuperation_Arbre_GArb(GtkTreeStore *store, Arbre *arbre, GtkTreeIter iterPere, int level) ;
 * @brief Récupère les arbres initier en mémoire
 *
 * @param[in,out] store un GtkTreeStore qui sera afficher dans le treeView
 * @param arbre l'arbre que l'on souhaite voir
 * @param[in,out] iterPere est le père des lignes à insérer
 * @param level est le nombre d'enfant que l'on récupère. Pour voir les expand d'un dossier, il faut récupérer le sous arbre enfant. Donc mettre +1.
 */
void recuperation_Arbre_GArb(GtkTreeStore *store, Arbre *arbre, GtkTreeIter *iterPere, int level);

/**
 * @fn void expanded(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);
 * @brief Fonction appeler lors d'une ouverture d'un regroupement.
 *
 * @param ce sont ceux de gtk
 */
void expanded(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);
/**
 * @fn void collapsed(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);
 * @brief fonction appeler lors de la fermeture d'un regroupement
 *
 * @param ce sont ceux de gtk
 */
void collapsed(GtkTreeView *tree_view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);


void tree_selection_changed_cb(GtkTreeSelection *selection, gpointer data);

#endif
